package com.ktjy.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @return 13141
 * 2025/6/23
 * 08:52
 */
public class TimeSpanAspect {
    private static final Logger log = LoggerFactory.getLogger(TimeSpanAspect.class);

    /**
     * 环绕增强
     */
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        log.info("【环绕增强-前置】记录 {} 方法执行的开始时间.", jp.getSignature().getName());
        // 进入方法之前就开始记录时间
        long startTime = System.currentTimeMillis();
        try {
            // 通过 proceed() 方法可以执行目标方法
            Object result = jp.proceed();
            log.info("【环绕增强-后置】{} 方法的执行结果为 {}.", jp.getSignature().getName(), result);
            // 注意：环绕增强要将结果返回
            return result;
        } catch (Throwable e) {
            log.info("【环绕增强-异常抛出】{} 方法执行异常信息为 {}.", jp.getSignature().getName(), e.getMessage());
            // 注意：不能隐藏异常，需要抛出
            throw e;
        } finally {
            // 在 finally 中记录结束时间，保证不管是正常还是异常都能记录执行时间
            long endTime = System.currentTimeMillis();
            log.info("【环绕增强-最终】记录 {} 方法的执行的结束时间，并计算耗时为 {} ms.", jp.getSignature().getName(),
                    (endTime - startTime));
        }
    }
}
